/*
 * Copyright (c) 2023, 2023,yzc.cn All rights reserved.
 *
 */
package cn.yzc;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * <p>Project: SpringPro - ProxyFactory</p>
 * <p>Powered by yzc On 2023-10-19 20:33:11</p>
 * <p>描述：<p>
 *
 * @author yzc [yzc0415@126.com]
 * @version 1.0
 * @since 17
 */
public class ProxyFactory {
    public static <T> T createProxy(T target) {
        //1.创建工具类的实例
        Enhancer enhancer = new Enhancer();
        //2.设置代理类的父类  目标类类型
        enhancer.setSuperclass(target.getClass());
        //3.增加横切逻辑 设置方法拦截 拦截目标方法 增加逻辑
        enhancer.setCallback(new MethodInterceptor() {
            /**
             *
             * @param o 代理类实例
             * @param method  代理的目标方法
             * @param objects 目标方法的参数
             * @param methodProxy
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //增加横切逻辑的地方
                //添加日志
                System.out.println("开始订单日志");
                //添加事务
                System.out.println("开启事务");
                //调用目标方法 执行目标对象target中的method方法
                Object obj = method.invoke(target, objects);
                //提交事务
                System.out.println("提交事务");
                System.out.println("保存订单成功");
                return obj; //将执行目标方法的返回值 返回
            }
        });
        //4.返回创建代理类实例
        return (T) enhancer.create();
    }
}
